package controllers

import (
	"GoWebBluebell/logic"
	"GoWebBluebell/models"
	"fmt"
	"strconv"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

func CreatePostHandler(c *gin.Context) {
	//1.获取参数 参数效验

	// c.ShouldBindJSON() 调用gin框架的validator --> binding tag 做数据的绑定
	p := new(models.Post)
	if err := c.ShouldBindJSON(p); err != nil {
		ResponseError(c, CodeInvalidParam)
		return
	}
	fmt.Println(p, "hello")
	// 中间件曽存储过UserID, 可以随时取出
	// 从c 取出当前发请求的用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, CodeNeedLogin)
		return
	}
	p.AuthorID = userID

	//2.创建帖子
	if err := logic.CreatePost(p); err != nil {
		zap.L().Error("logic.CreatePost(p) failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}

	//3.返回响应
	ResponseSuccess(c, nil)

}

// 获取帖子详情的函数
func PostDetailHandler(c *gin.Context) {
	// 1.获取参数(从URL获取id)
	pidStr := c.Param("id")
	pid, err := strconv.ParseInt(pidStr, 10, 64)
	//fmt.Println(pid)
	if err != nil {
		zap.L().Error("get post detail with invalid param", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}

	// 2.根据id取出帖子数据(查数据库)
	data, err := logic.GetPostByID(pid)
	if err != nil {
		zap.L().Error("logic.GetPostByID(pid) failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}

	// 3.返回响应
	ResponseSuccess(c, data)
}

// GetPostListHandler 获取帖子列表
func GetPostListHandler(c *gin.Context) {
	// 获取分页参数
	page, size := getPageInfo(c)
	// 获取数据
	data, err := logic.GetPostList(page, size)
	if err != nil {
		zap.L().Error("logic.GetPostList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	// 返回响应
	ResponseSuccess(c, data)
}

// 函数注释 简介 描述信息 分组 Accept接收请求的内容编码类型 Produce返回的响应数据类型
// param参数 Authorization需要认证 在header请求头 string格式 是否必须 注释
// param参数 object对象类型 参数在query里
// 安全性认证 返回的相应的数据内容(状态码和对象) Router绑定url和请求类型

// GetPostListHandler2 升级版帖子列表接口  根据社区和前端传来的参数(按分数, 按创建时间)去查询帖子列表
// @Summary 升级版帖子列表接口
// @Description 可按社区按时间或分数排序查询帖子列表接口
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param object query models.ParamPostList false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} _ResponsePostList
// @Router /posts2 [get]
func GetPostListHandler2(c *gin.Context) {
	// 1. 获取参数
	// 2. 去redis查询id列表
	// 3. 根据id去数据库查询帖子详细信息
	// GET请求参数(后面跟的学名叫query string参数):/api/v1/post2?page=1&size=10&order=time
	p := &models.ParamPostList{
		Page:        1,
		Size:        10,
		Order:       models.OrderTime,
		CommunityID: 0,
	} //设定初始参数
	//c.ShouldBind() 根据请求中数据类型选择相应的方法获得数据
	//c.ShouldBindJSON() 请求中携带json格式数据, 才用这个方法获取到数据
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("GetPostListHandler2 with invalid params", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}

	// 获取数据
	data, err := logic.GetPostListNew(p)
	if err != nil {
		zap.L().Error("logic.GetPostList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	// 返回响应
	ResponseSuccess(c, data)
}
